package salvarcasodetestes;

import java.lang.reflect.Method;
import java.util.LinkedList;

import entidadesparaguardardadosteste.CasoDeTeste;
import gui.DeclaracaoDeMetodo;

public class ConverteCasosDeTesteECasosDeTesteSerializaveis 
{
	public static LinkedList<CasoDeTesteSerializavel> converterEmCasoDeTesteSerializavel(LinkedList<CasoDeTeste> casosDeTeste)
	{
		LinkedList<CasoDeTesteSerializavel> casosDeTesteSerializaveis = new LinkedList<CasoDeTesteSerializavel>();
		for(int i = 0; i < casosDeTeste.size(); i++)
		{
			CasoDeTeste casoDeTesteParaConverter = casosDeTeste.get(i);
			CasoDeTesteSerializavel novoCasoDeTestSerializavel = ConverteCasosDeTesteECasosDeTesteSerializaveis.converterEmCasoDeTesteSerializavel(casoDeTesteParaConverter);
			casosDeTesteSerializaveis.add(novoCasoDeTestSerializavel);
		}
		
		return casosDeTesteSerializaveis;
	}
	
	public static LinkedList<CasoDeTeste> converterEmCasoDeTeste(LinkedList<CasoDeTesteSerializavel> casosDeTesteSerializaveis)
	{
		LinkedList<CasoDeTeste> casosDeTeste = new LinkedList<CasoDeTeste>();
		for(int i = 0; i < casosDeTesteSerializaveis.size(); i++)
		{
			CasoDeTesteSerializavel casoDeTesteParaConverter = casosDeTesteSerializaveis.get(i);
			CasoDeTeste novoCasoDeTeste = ConverteCasosDeTesteECasosDeTesteSerializaveis.converterEmCasoDeTeste(casoDeTesteParaConverter);
			casosDeTeste.add(novoCasoDeTeste);
		}
		
		return casosDeTeste;
	}
	
	public static CasoDeTesteSerializavel converterEmCasoDeTesteSerializavel(CasoDeTeste casoDeTeste)
	{
		CasoDeTesteSerializavel casoDeTesteSerializavel = new CasoDeTesteSerializavel();
		int idCasoDeTeste = casoDeTeste.getIdCasoDeTeste();
		casoDeTesteSerializavel.setIdCasoDeTeste(idCasoDeTeste);
		
		String urlProjetoDoCasoDeTeste = casoDeTeste.getEnderecoDoProjetoDaClasseATestar();
		casoDeTesteSerializavel.setEnderecoDoProjetoDaClasseATestar(urlProjetoDoCasoDeTeste);
		
		//temos de setar ao caso de teste serializavel uma declaracao de metodo Serializavel(nao comum)
		//primeiro, ver se a declaracao de metodo do caso de teste nao eh nula, senao perdemos tempo criando uma DeclaracaoDeMetodoSerializavel...
		if(casoDeTeste.getMetodo() != null)
		{
			String urlParaArquivoJavaQueTemOMetodo = casoDeTeste.getMetodo().getUrlParaArquivoJavaQueTemOMetodo();
			String cabecalhoDoMetodo = casoDeTeste.getMetodo().getCabecalhoDoMetodo();
			DeclaracaoDeMetodoSerializavel declaracaoDeMetodoSerializavel = new DeclaracaoDeMetodoSerializavel(urlProjetoDoCasoDeTeste, urlParaArquivoJavaQueTemOMetodo, cabecalhoDoMetodo);
			casoDeTesteSerializavel.setMetodo(declaracaoDeMetodoSerializavel);
		}
		
		//temos de copiar o nome da classe associada ao caso de teste...
		String nomeClasseAssociadaAoCasoDeTeste = casoDeTeste.getNomeClasseAssociadaAoCasoDeTeste();
		casoDeTesteSerializavel.setNomeClasseAssociadaAoCasoDeTeste(nomeClasseAssociadaAoCasoDeTeste);
		
		//copiar os valores dos parametros do metodo...
		LinkedList<Object> valoresDosParametrosDoMetodo = casoDeTeste.getValoresDosParametrosDoMetodo();
		casoDeTesteSerializavel.setValoresDosParametrosDoMetodo(valoresDosParametrosDoMetodo);
		
		//e o valor esperado da saida para completar o casso de teste serializavel
		Object valorEsperadoParaASaida = casoDeTeste.getValorEsperadoDaSaida();
		casoDeTesteSerializavel.setValorEsperadoDaSaida(valorEsperadoParaASaida);
		
		boolean casoDeTesteEstahCompleto = casoDeTeste.oCasoDeTesteEstahCompleto();
		casoDeTesteSerializavel.setCasoDeTesteEstahCompleto(casoDeTesteEstahCompleto);
		return casoDeTesteSerializavel;
	}
	
	public static CasoDeTeste converterEmCasoDeTeste(CasoDeTesteSerializavel casoDeTesteSerializavel)
	{
		CasoDeTeste casoDeTeste = new CasoDeTeste();
		int idCasoDeTeste = casoDeTesteSerializavel.getIdCasoDeTeste();
		casoDeTeste.setIdCasoDeTeste(idCasoDeTeste);
		
		String urlProjetoDoCasoDeTeste = casoDeTesteSerializavel.getEnderecoDoProjetoDaClasseATestar();
		casoDeTeste.setEnderecoDoProjetoDaClasseATestar(urlProjetoDoCasoDeTeste);
		
		
		//temos de setar ao caso de teste  uma declaracao de metodo(comum, nao declaracao de metodo Serializavel)
		//primeiro, ver se a declaracao de metodo do caso de teste serializavel nao eh nula, senao perdemos tempo criando uma DeclaracaoDeMetodo...
		if(casoDeTesteSerializavel.getMetodo() != null)
		{
			Method metodoAssociadoAoCasoDeTeste = casoDeTesteSerializavel.getMetodo().getMetodoAssociado();
			String urlParaArquivoJavaQueTemOMetodo = casoDeTesteSerializavel.getMetodo().getUrlParaArquivoJavaQueTemOMetodo();
			
			DeclaracaoDeMetodo declaracaoDeMetodo = new DeclaracaoDeMetodo(metodoAssociadoAoCasoDeTeste, urlParaArquivoJavaQueTemOMetodo);
			casoDeTeste.setMetodo(declaracaoDeMetodo);
		}
				
		//temos de copiar o nome da classe associada ao caso de teste...
		String nomeClasseAssociadaAoCasoDeTeste = casoDeTesteSerializavel.getNomeClasseAssociadaAoCasoDeTeste();
		casoDeTeste.setNomeClasseAssociadaAoCasoDeTeste(nomeClasseAssociadaAoCasoDeTeste);
				
		//copiar os valores dos parametros do metodo...
		LinkedList<Object> valoresDosParametrosDoMetodo = casoDeTesteSerializavel.getValoresDosParametrosDoMetodo();
		casoDeTeste.setValoresDosParametrosDoMetodo(valoresDosParametrosDoMetodo);
				
		//e o valor esperado da saida para completar o casso de teste 
		Object valorEsperadoParaASaida = casoDeTesteSerializavel.getValorEsperadoDaSaida();
		casoDeTeste.setValorEsperadoDaSaida(valorEsperadoParaASaida);
		
		boolean casoDeTesteEstahCompleto = casoDeTesteSerializavel.oCasoDeTesteEstahCompleto();
		casoDeTeste.setCasoDeTesteEstahCompleto(casoDeTesteEstahCompleto);
		return casoDeTeste;
	}

}
